package com.insight.modules.message.controller;

import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import com.insight.common.api.vo.Result;
import com.insight.common.aspect.annotation.AutoLog;
import com.insight.common.system.base.controller.JeecgController;
import com.insight.common.system.query.QueryGenerator;
import com.insight.modules.message.entity.MsgParams;
import com.insight.modules.message.entity.SysMessageTemplate;
import com.insight.modules.message.service.ISysMessageTemplateService;
import com.insight.modules.message.util.PushMsgUtil;
import com.insight.modules.system.util.ExcelUtil;
import com.insight.modules.umpPwdManage.entity.UmpPwdManage;
import com.insight.modules.umpPwdManage.service.IUmpPwdManageService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;
import java.util.Map;

/**
 * @Description: 消息模板
 * @Author: jeecg-boot
 * @Sate: 2019-04-09
 * @Version: V1.0
 */
@Slf4j
@RestController
@RequestMapping("/sys/message/sysMessageTemplate")
public class SysMessageTemplateController extends JeecgController<SysMessageTemplate, ISysMessageTemplateService> {

	@Autowired
	private ISysMessageTemplateService sysMessageTemplateService;

	@Autowired
	private PushMsgUtil pushMsgUtil;

	@Autowired
	private IUmpPwdManageService umpPwdManageService;

	@Value("${excel.messageTemplate}")
	private String path;

	/**
	 * 分页列表查询
	 * @param sysMessageTemplate 查询条件封装对象
	 * @param pageNo 当前页码，默认1
	 * @param pageSize 每页条数，默认10
	 * @param req HTTP请求对象，用于获取请求参数
	 * @return 分页结果封装的Result对象
	 */
	@AutoLog("消息模板管理-分页列表查询")
	@GetMapping(value = "/list")
	public Result<?> queryPageList(SysMessageTemplate sysMessageTemplate,
								   @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
								   @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
								   HttpServletRequest req) {
		// 临时保存模板code、content、name
		String code = sysMessageTemplate.getTemplateCode();
		String content = sysMessageTemplate.getTemplateContent();
		String name = sysMessageTemplate.getTemplateName();

		// 为避免模糊查询字段重复设置，将原对象字段置空
		if (StringUtils.isNotBlank(code)) {
			sysMessageTemplate.setTemplateCode(null);
		}
		if (StringUtils.isNotBlank(content)) {
			sysMessageTemplate.setTemplateContent(null);
		}
		if (StringUtils.isNotBlank(name)) {
			sysMessageTemplate.setTemplateName(null);
		}

		// 初始化QueryWrapper，封装查询条件
		QueryWrapper<SysMessageTemplate> queryWrapper = QueryGenerator.initQueryWrapper(sysMessageTemplate, req.getParameterMap());

		// 根据模板code/content/name模糊查询条件追加
		if (StringUtils.isNotBlank(code)) {
			queryWrapper.like("template_code", code);
		}
		if (StringUtils.isNotBlank(content)) {
			queryWrapper.like("template_content", content);
		}
		if (StringUtils.isNotBlank(name)) {
			queryWrapper.like("template_name", name);
		}

		// 创建分页对象
		Page<SysMessageTemplate> page = new Page<>(pageNo, pageSize);

		// 分页查询结果
		IPage<SysMessageTemplate> pageList = sysMessageTemplateService.page(page, queryWrapper);
		return Result.ok(pageList);
	}

	/**
	 * 添加消息模板
	 * @param sysMessageTemplate 消息模板实体
	 * @return 添加结果
	 */
	@AutoLog("消息模板管理-添加")
	@PostMapping(value = "/add")
	public Result<?> add(@RequestBody SysMessageTemplate sysMessageTemplate) {
		// 模板内容不能为空校验
		if (StringUtils.isEmpty(sysMessageTemplate.getTemplateContent())) {
			return Result.error("添加失败,模板内容不能为空");
		}
		// 保存模板
		sysMessageTemplateService.save(sysMessageTemplate);
		return Result.ok("添加成功！");
	}

	/**
	 * 编辑消息模板
	 * @param sysMessageTemplate 消息模板实体
	 * @return 编辑结果
	 */
	@AutoLog("消息模板管理-编辑")
	@PutMapping(value = "/edit")
	public Result<?> edit(@RequestBody SysMessageTemplate sysMessageTemplate) {
		// 模板内容不能为空校验
		if (StringUtils.isEmpty(sysMessageTemplate.getTemplateContent())) {
			return Result.error("修改失败,模板内容不能为空");
		}
		// 根据ID更新模板信息
		sysMessageTemplateService.updateById(sysMessageTemplate);
		return Result.ok("更新成功！");
	}

	/**
	 * 根据ID删除消息模板
	 * @param id 模板ID
	 * @return 删除结果
	 */
	@AutoLog("消息模板管理-通过id删除")
	@DeleteMapping(value = "/delete")
	public Result<?> delete(@RequestParam(name = "id", required = true) String id) {
		sysMessageTemplateService.removeById(id);
		return Result.ok("删除成功!");
	}

	/**
	 * 批量删除消息模板
	 * @param ids 多个模板ID，逗号分隔
	 * @return 删除结果
	 */
	@AutoLog("消息模板管理-批量删除")
	@DeleteMapping(value = "/deleteBatch")
	public Result<?> deleteBatch(@RequestParam(name = "ids", required = true) String ids) {
		this.sysMessageTemplateService.removeByIds(Arrays.asList(ids.split(",")));
		return Result.ok("批量删除成功！");
	}

	/**
	 * 根据ID查询消息模板
	 * @param id 模板ID
	 * @return 查询结果
	 */
	@AutoLog("消息模板管理-通过id查询")
	@GetMapping(value = "/queryById")
	public Result<?> queryById(@RequestParam(name = "id", required = true) String id) {
		SysMessageTemplate sysMessageTemplate = sysMessageTemplateService.getById(id);
		return Result.ok(sysMessageTemplate);
	}

	/**
	 * 导出消息模板为Excel
	 * @param request 请求对象
	 * @param response 响应对象
	 * @param sysMessageTemplate 查询条件
	 */
	@AutoLog("消息模板管理-导出excel")
	@GetMapping(value = "/exportXls")
	public void exportXls(HttpServletRequest request, HttpServletResponse response, SysMessageTemplate sysMessageTemplate) {
		// 获取加密配置
		UmpPwdManage zip = umpPwdManageService.getZip();
		// 调用父类导出带加密的Excel方法
		super.exportXlsZip(request, response, sysMessageTemplate, SysMessageTemplate.class, "推送消息模板", zip.getZipPwd(), zip.getIsEncry());
	}

	/**
	 * Excel导入消息模板数据
	 * @param request 请求对象
	 * @param response 响应对象
	 * @return 导入结果
	 */
	@AutoLog("消息模板管理-excel导入")
	@PostMapping(value = "/importExcel")
	public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
		return super.importExcel(request, response, SysMessageTemplate.class);
	}

	/**
	 * 发送消息接口
	 * @param msgParams 消息发送参数对象
	 * @return 发送结果
	 */
	@AutoLog("消息模板管理-发送消息")
	@PostMapping(value = "/sendMsg")
	public Result<SysMessageTemplate> sendMessage(@RequestBody MsgParams msgParams) {
		Result<SysMessageTemplate> result = new Result<SysMessageTemplate>();
		Map<String, String> map = null;
		try {
			if (msgParams == null || msgParams.getTestData() == null) {
				result.error500("参数为空！");
				return result;
			}
			map = (Map<String, String>) JSON.parse(msgParams.getTestData());
		} catch (Exception e) {
			result.error500("解析Json出错！");
			return result;
		}
		boolean is_sendSuccess = pushMsgUtil != null && pushMsgUtil.sendMessage(msgParams.getMsgType(), msgParams.getTemplateCode(), map, msgParams.getReceiver());
		if (is_sendSuccess) {
			result.success("发送消息任务添加成功！");
		} else {
			result.error500("发送消息任务添加失败！");
		}
		return result;
	}

	/**
	 * 模板文件下载接口
	 * @param response 响应对象，用于写出文件流
	 * @param reqsuest 请求对象（无实际使用）
	 */
	@AutoLog(value = "消息模板管理-模板下载")
	@ApiOperation("模板导出")
	@GetMapping(value = "/downloadTemplate")
	public void downloadTemplate(HttpServletResponse response, HttpServletRequest reqsuest) {
		try {
			// 读取模板文件流
			InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream(path);
			// 获取文件后缀
			String str1 = path.substring(0, path.indexOf('.'));
			String str2 = path.substring(str1.length());
			// 调用工具方法下载文件
			ExcelUtil.downloadPoi(inputStream, response, "消息模板导入模板" + str2);
		} catch (IOException e) {
			e.printStackTrace();
			log.info("出错了, {}", e.getMessage());
		}
	}
}

